/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Presentation;

import BO.Hotel;
import Controllers.*;
import Dao.*;
import Exceptions.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;

/**
 *
 * @author Bruno Lopes
 */
public class Presentation {

    public boolean start() throws ClassNotFoundException, SQLException, FileNotFoundException, IOException, DataAccessException, BusinessException //throws ClassNotFoundException, SQLException,
    //DataAccessException, BusinessException, ParseException, IOException
    {
//bruno
//Filipe
        boolean toReturn = true;
        Scanner teclado = new Scanner(System.in);

        String menu = "";

        menu += "\n====================\r";
        menu += "\nCentral de Reservas\r";
        menu += "\n====================\r\n";
        menu += "1) Menu de Consultas\r\n";
        menu += "2) Menu de Registo\r\n";
        menu += "3) Menu Agência\r\n";
        menu += "0) Sair\r\n";
        menu += "\r\n";
        menu += "Escolha a sua opçao: ";

        String tecla = "";

        do {
            System.out.print(menu);

            tecla = teclado.next();
        } 
        while ((tecla.length() > 1) || 
                ((!tecla.equals("0"))
                && (!tecla.equals("1"))
                && (!tecla.equals("2"))
                && (!tecla.equals("3"))
                )
        );

        char cTecla = tecla.charAt(0);

//        try {

        switch (cTecla) {
            case '1':
                mostraMenuConsultas();
                break;
            case '2':
                mostraMenuRegistos();
                break;
            case '3':
                mostraMenuAgencia();
                break;
            default:
                toReturn = false;
                break;
        }

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }

        return toReturn;
    }


    //2 swicth's, um para nº3 outro para nº4 
    private void mostraMenuConsultas() {
        Scanner teclado = new Scanner(System.in);
        String menu = "";

        menu += "\n=================================\r";
        menu += "\nCentral de Reservas :: Consultas\r";
        menu += "\n=================================\r\n";
        menu += "1) Consulta de disponibilidade de hotéis\r\n";
        menu += "2) Consulta de disponibilidade de transporte\r\n";
        menu += "3) Consulta de reservas por cliente (id/nome)\r\n";
        menu += "4) Consulta de reservas por agência (id/nome)\r\n";
        menu += "5) Listagem de agências\r\n";
        menu += "6) Listagem de cliente por agência\r\n";
        menu += "0) Voltar\r\n";
        menu += "\r\n";
        menu += "Escolha a sua opçao: ";

        String tecla = "";

        do {
            System.out.print(menu);

            tecla = teclado.next();
        } while ((tecla.length() > 1)
                || ((!tecla.equals("0"))
                && (!tecla.equals("1"))
                && (!tecla.equals("2"))
                && (!tecla.equals("3"))
                && (!tecla.equals("4"))
                && (!tecla.equals("5"))
                && (!tecla.equals("6"))));

        char cTecla = tecla.charAt(0);

//        try {

        switch (cTecla) {
            case '1':
                disponibilidadeHoteis();
                break;
            case '2':
                disponibilidadeTransporte();
                break;
            case '3':
                consReservaPorCliente();
                break;
            case '4':
                consReservaPorAgencia();
                break;
            case '5':
                listaAgencia();
                break;
            case '6':
                listaClientePorAgencia();
                break;
            default:
                break;
        }

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
    }

    private void mostraMenuRegistos() throws BusinessException, DataAccessException, IOException, ClassNotFoundException {
        Scanner teclado = new Scanner(System.in);
        String menu = "";

        menu += "\n================================\r";
        menu += "\nCentral de Reservas :: Registos\r";
        menu += "\n================================\r\n";
        menu += "1) Registar Hotel\r\n";
        menu += "2) Registar Agência\r\n";
        menu += "3) Registar Transporte\r\n";
        menu += "4) Alterar dados de Hotel\r\n";
        menu += "5) Alterar dados de Agência\r\n";
        menu += "6) Alterar dados de Transporte\r\n";
        menu += "0) Voltar\r\n";
        menu += "\r\n";
        menu += "Escolha a sua opçao: ";

        String tecla = "";

        do {
            System.out.print(menu);

            tecla = teclado.next();
        } while ((tecla.length() > 1)
                || ((!tecla.equals("0"))
                && (!tecla.equals("1"))
                && (!tecla.equals("2"))
                && (!tecla.equals("3"))
                && (!tecla.equals("4"))
                && (!tecla.equals("5"))
                && (!tecla.equals("6"))));

        char cTecla = tecla.charAt(0);

//      try {

        switch (cTecla) {
            case '1':
                registarHotel();
                break;
            case '2':
                registarAgencia();
                break;
            case '3':
                registarTransporte();
                break;
            case '4':
                alterarDadosHotel();
                break;
            case '5':
                alterarDadosAgencia();
                break;
            case '6':
                alterarDadosTransporte();
                break;
            default:
                break;
//            }

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (ParseException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
        }
    }

    private static void registarHotel()// throws ClassNotFoundException,
    //SQLException, DataAccessException, BusinessException, IOException 
    {
        Scanner teclado = new Scanner(System.in);

        String info = "\n======================\r\n";
        info += "Registar Hotel\r\n";
        info += "======================\r\n";

        System.out.println(info);

        System.out.print("Nome? ");
        String nome = teclado.nextLine();

        System.out.print("Nº de quartos? ");
        int quartos = teclado.nextInt();

        System.out.print("Morada? ");
        String morada = teclado.nextLine();

//        try {

        HotelController.criarHotel(nome, quartos, morada);

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
    }

    private static void registarAgencia() //throws ClassNotFoundException,
    // SQLException, DataAccessException, BusinessException, IOException 
    {
        Scanner teclado = new Scanner(System.in);

        String info = "\n======================\r\n";
        info += "Registar Agência\r\n";
        info += "======================\r\n";

        System.out.println(info);

        System.out.print("Nome? ");
        String nome = teclado.nextLine();

        System.out.print("Localidade? ");
        String localidade = teclado.nextLine();

//        try {

        AgencyController.criarAgencia(nome, localidade);

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
    }

    private static void registarTransporte() throws BusinessException, DataAccessException, IOException, ClassNotFoundException //throws ClassNotFoundException,
    //            SQLException, DataAccessException, BusinessException, IOException 
    {
        Scanner teclado = new Scanner(System.in);

        String info = "\n======================\r\n";
        info += "Registar transporte\r\n";
        info += "======================\r\n";

        System.out.println(info);

        //Preciso de listar os tipos de transporte
        System.out.print("Tipo de transporte? ");
        int tipoTr = teclado.nextInt();

        System.out.print("Nº de lugares? ");
        int vacancies = teclado.nextInt();

        System.out.print("Nome da companhia? ");
        String nomeComp = teclado.nextLine();

        System.out.print("Destino? ");
        String destino = teclado.nextLine();

//        try {

        TransferController.criarTransporte(tipoTr, vacancies, nomeComp, destino);

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
    }

    //Switch com a opção de pesquisa por id ou por nome do hotel
    private static void alterarDadosHotel()// throws ClassNotFoundException,
    //SQLException, DataAccessException, BusinessException, IOException 
    {

        int tecla;
        Scanner teclado = new Scanner(System.in);

        String info = "\n=======================\r\n";
        info += "Alterar dados do Hotel\r\n";
        info += "=======================\r\n";

        System.out.println(info);

        do {
            String subMenu = "";
            subMenu += "Escolha uma das opções:\r\n";
            subMenu += "1) id?\r\n";
            subMenu += "2) Nome?\r\n";

            System.out.println(subMenu);
            tecla = teclado.nextInt();
        } while (tecla != 1 || tecla != 2);

        if (tecla == 1) {
            HotelController.alterarDadosId(tecla);
        }

        if (tecla == 2) {
            HotelController.alterarDadosNome(tecla);
        }


//        try {

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }

    }

    //Switch com a opção de pesquisa por id ou por nome da agência
    private static void alterarDadosAgencia() //throws ClassNotFoundException,
    //SQLException, DataAccessException, BusinessException, IOException
    {

        int tecla;
        Scanner teclado = new Scanner(System.in);

        String info = "\n=======================\r\n";
        info += "Alterar dados de cliente\r\n";
        info += "=======================\r\n";

        System.out.println(info);

        do {
            String subMenu = "";
            subMenu += "Escolha uma das opções:\r\n";
            subMenu += "1) id?\r\n";
            subMenu += "2) Nome?\r\n";

            System.out.println(subMenu);
            tecla = teclado.nextInt();
        } while (tecla != 1 || tecla != 2);

        if (tecla == 1) {
            AgencyController.alterarDadosId(tecla);
        }

        if (tecla == 2) {
            AgencyController.alterarDadosNome(tecla);
        }
//        try {
//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }

    }

    //Perguntar qual a companhia e depois listo os transportes associados
    //a essa companhia; peço o id.
    private static void alterarDadosTransporte() //throws ClassNotFoundException,
    // SQLException, DataAccessException, BusinessException, IOException
    {

        Scanner teclado = new Scanner(System.in);

        String info = "\n=======================\r\n";
        info += "Alterar dados de transporte\r\n";
        info += "=======================\r\n";

        System.out.println(info);

        System.out.println("Qual o id?");

        int id = teclado.nextInt();
        TransferController.alterarDadosId(id);


//        try {
//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }

    }

    private void mostraMenuAgencia() throws ClassNotFoundException, SQLException, FileNotFoundException, IOException, DataAccessException {
        Scanner teclado = new Scanner(System.in);
        String menu = "";

        menu += "\n===============================\r";
        menu += "\nCentral de Reservas :: Agência\r";
        menu += "\n===============================\r\n";
        menu += "1) Registar cliente\r\n";
        menu += "2) Reserva de hotél\r\n";
        menu += "3) Reserva de transporte\r\n";
        menu += "4) Anulação de reserva de hotél\r\n";
        menu += "5) Anulação de reserva de transporte\r\n";
        menu += "6) Consulta de disponibilidades por localização\r\n";
        menu += "7) Consulta de reservas por agência\r\n";
        menu += "8) Consulta de clientes registados\r\n";
        menu += "9) Alterar dados de cliente\r\n";
        menu += "0) Voltar\r\n";
        menu += "\r\n";
        menu += "Escolha a sua opçao: ";

        String tecla = "";

        do {
            System.out.print(menu);

            tecla = teclado.next();
        } while ((tecla.length() > 1)
                || ((!tecla.equals("0"))
                && (!tecla.equals("1"))
                && (!tecla.equals("2"))
                && (!tecla.equals("3"))
                && (!tecla.equals("4"))
                && (!tecla.equals("5"))
                && (!tecla.equals("6"))
                && (!tecla.equals("7"))
                && (!tecla.equals("8"))
                && (!tecla.equals("9"))));

        char cTecla = tecla.charAt(0);

        switch (cTecla) {
            case '1':
                registarCliente();
                break;
            case '2':
                reservaHotel();
                break;
            case '3':
                reservaTransporte();
                break;
            case '4':
                anularReservaHotel();
                break;
            case '5':
                anularReservaTransporte();
                break;
            case '6':
                disponibilidadeLocal();
                break;
            case '7':
                reservaPorAgencia();
                break;
            case '8':
                clientesRegistados();
                break;
            case '9':
                alterarDadosCliente();
                break;
            default:
                break;
        }
    }

    private void registarCliente() //throws ClassNotFoundException,
    //            SQLException, DataAccessException, BusinessException, IOException 
    {
        Scanner teclado = new Scanner(System.in);

        String info = "\n======================\r\n";
        info += "Registar Cliente\r\n";
        info += "======================\r\n";

        System.out.println(info);

        //Preciso de listar os tipos de transporte
        System.out.print("Primeiro nome? ");
        String pNome = teclado.nextLine();

        System.out.print("Ultimo nome? ");
        String uNome = teclado.nextLine();

        System.out.print("Morada? ");
        String morada = teclado.nextLine();

        System.out.print("NIF? ");
        int nif = teclado.nextInt();

//        try {

        CustomerController.criarCliente(pNome, uNome, morada, nif);

//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }
    }

    private void reservaHotel() throws ClassNotFoundException, SQLException, FileNotFoundException, IOException, DataAccessException {

        String local = "";
        boolean result = false;
        String tecla;
        Scanner teclado = new Scanner(System.in);
        int opcao;

        String info = "\n=======================\r\n";
        info += "Reserva de Hotel\r\n";
        info += "=======================\r\n";

        System.out.println(info);

        System.out.println(HotelDao.getAll());

        do {

            System.out.print("Escolha o Local? ");

            local = teclado.nextLine();

        } while (!(HotelDao.hotelListByLocal(local).containsKey(local)));


        HashMap<String, Hotel> lista = HotelDao.hotelListByLocal(local);

        Iterator iterator = lista.keySet().iterator();
        System.out.println("\nHoteis disponoveis\n");
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            System.out.println(lista.get(key));
        }

        do {
            String subMenu = "";
            subMenu += "\nEscolha uma das opções:\r\n";
            subMenu += "1) id(Hotel)?\r\n";
            subMenu += "2) Nome(Hotel)?\r\n";

            System.out.println(subMenu);
            tecla = teclado.nextLine();

            //Try catch (Filipe)
            opcao = Integer.parseInt(tecla);

            if (opcao < 1 || opcao > 2) {
                System.out.println("\nTem de escolher uma das opções.");
            }

        } while (!(opcao == 1 || opcao == 2));


        if (opcao == 1) {
            System.out.print("\nEscolha o Hotel? ");
            String nome = teclado.nextLine();
            HotelController.nameExists(nome);
            /*criar metodo que retorne um boolean (HotelController) para
             * verificar os hoteis disponiveis*/

            AgencyController.alterarDadosId(opcao);
        } else {

            if (opcao == 2) {
                System.out.print("\nEscolha o Hotel? ");
                String nome = teclado.nextLine();
                HotelController.nameExists(nome);
                /*criar metodo que retorne um boolean (HotelController) para
                 * verificar os hoteis disponiveis*/

                AgencyController.alterarDadosNome(opcao);
            }
        }

        System.out.print("Nº de quartos? ");
        int quartos = teclado.nextInt();

        System.out.print("Data? ");
        String data = teclado.nextLine();


    }

    private void disponibilidadeHoteis() {
        System.out.println(HotelDao.availableHotels());
    }

    private void disponibilidadeTransporte() {
        System.out.println(TransferDao.availableTransfers());
    }

    private void consReservaPorCliente() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void consReservaPorAgencia() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void listaAgencia() {
    }

    private void listaClientePorAgencia() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void reservaTransporte() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void anularReservaHotel() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void anularReservaTransporte() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void disponibilidadeLocal() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void reservaPorAgencia() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void clientesRegistados() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void alterarDadosCliente() //throws ClassNotFoundException,
    // SQLException, DataAccessException, BusinessException, IOException
    {

        int tecla;
        Scanner teclado = new Scanner(System.in);

        String info = "\n=======================\r\n";
        info += "Alterar dados do cliente\r\n";
        info += "=======================\r\n";

        System.out.println(info);

        do {
            String subMenu = "";
            subMenu += "Escolha uma das opções:\r\n";
            subMenu += "1) id?\r\n";
            subMenu += "2) Nome?\r\n";

            System.out.println(subMenu);
            tecla = teclado.nextInt();
        } while (tecla != 1 || tecla != 2);

        if (tecla == 1) {
            CustomerController.alterarDadosId(tecla);
        }

        if (tecla == 2) {
            CustomerController.alterarDadosNome(tecla);
        }

//        try {
//        } catch (ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (SQLException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        } catch (DataAccessException ex) {
//            System.err.println("Erro: " + ex.getMessage());
//        }

    }
}
    
  